{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ArrayList Excecise\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex1：挖雷游戏\n",
    "\n",
    "我们来写一个小程序：\n",
    "\n",
    "<img src=\"../images/ch02/mine.jpg\" width=\"200\"/> \n",
    "\n",
    "程序接收三个参数，M，N和p，然后生成一个M * N的矩阵，然后每一个cell有p的概率是地雷。生成矩阵后，再计算出每一个cell周围地雷的数量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "\n",
    "def minesweeper(m, n, p):\n",
    "    '''\n",
    "    1.生成一个棋盘\n",
    "    2.按照概率生成地雷\n",
    "    3.对不是地雷的格子进行处理,计算周围地雷的个数\n",
    "    4.打印整个棋盘\n",
    "    '''\n",
    "    \n",
    "    board = [[None]*(n+2) for i in range(m+2)]\n",
    "    for i in range(1,m+1):\n",
    "        for j in range(1,n+1):\n",
    "            r = random.random()\n",
    "            board[i][j] = -1 if r<p else 0\n",
    "    for i in range(1,m+1):\n",
    "        for j in range(1,n+1):\n",
    "            print(\"*\",end=\" \") if board[i][j]==-1 else print(\".\",end = \" \")\n",
    "        print()\n",
    "    for i in range(1,m+1):\n",
    "        for j in range(1,n+1):\n",
    "            if (board[i][j] !=-1):\n",
    "                for ii in range(i-1,i+2):\n",
    "                    for jj in range(j-1,j+2):\n",
    "                        if(board[ii][jj]==-1):\n",
    "                            board[i][j]+=1\n",
    "    print()\n",
    "    for i in range(1,m+1):\n",
    "        for j in range(1,n+1):\n",
    "            print(\"*\",end = \" \") if board[i][j] ==-1  else print(board[i][j],end=\" \")\n",
    "        print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ". * * * * . . . . . \n",
      ". . . . * * . . . . \n",
      ". . . * . . . * . . \n",
      ". . . * . . . * . . \n",
      ". . . . . . . . . * \n",
      "\n",
      "1 * * * * 3 1 0 0 0 \n",
      "1 2 4 5 * * 2 1 1 0 \n",
      "0 0 2 * 4 2 3 * 2 0 \n",
      "0 0 2 * 2 0 2 * 3 1 \n",
      "0 0 1 1 1 0 1 1 2 * \n"
     ]
    }
   ],
   "source": [
    "minesweeper(5, 10, 0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex2：矩阵0变换\n",
    "给一个m×n的矩阵，如果有一个元素为0，则把该元素对应的行与列所有元素全部变成0。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 首先开辟两个数组空间,一个存放行,一个存放列\n",
    "* 只要原数组中有0,就把0相应的行和列记录下来\n",
    "* 然后再次便利数组,只要对应记录的下标,就把该行和该列所有的数字变成0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# O(m+n) space complexity\n",
    "def zero(matrix):\n",
    "    m = [None]*len(matrix)\n",
    "    n = [None]*len(matrix[0])\n",
    "    for i in range(len(matrix)):\n",
    "        for j in range(len(matrix[0])):\n",
    "            if(matrix[i][j]==0):\n",
    "                m[i] = 1\n",
    "                n[j] = 1\n",
    "    for i in range(len(matrix)):\n",
    "        for j in range(len(matrix[0])):\n",
    "            if(m[i]==1 or n[j]==1):\n",
    "                matrix[i][j] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "matrix = [  [ 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 ],\n",
    "            [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],\n",
    "            [ 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 ],\n",
    "            [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],\n",
    "            [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 1, 1, 1, 0, 1, 1, 1, 1]\n",
      "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "[1, 1, 0, 1, 1, 1, 1, 1, 1, 1]\n",
      "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n"
     ]
    }
   ],
   "source": [
    "for x in matrix:\n",
    "    print(x, sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
      "[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
      "[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]\n",
      "[1, 1, 0, 1, 1, 0, 1, 1, 1, 1]\n"
     ]
    }
   ],
   "source": [
    "zero(matrix)\n",
    "for x in matrix:\n",
    "    print(x, sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex3：九宫图\n",
    "<img src=\"../images/ch02/magicsquare.jpg\" width=\"100\"/> "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 创建一个全0的数组(n* n)\n",
    "* 在最后一行,中间一列 添加1\n",
    "* 行+1,列+1 即为对角线位置\n",
    "    * 越界\n",
    "    * 有其他的非0值\n",
    "* 在对应的行列上 添加顺序数字\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def magic_square(n):\n",
    "    magic = [[0]*n for i in range(n)]\n",
    "    row = n-1\n",
    "    col = n//2\n",
    "    magic[row][col] = 1\n",
    "    for i in range(2,n*n+1):\n",
    "        try_row = (row+1)%n\n",
    "        try_col = (col+1)%n\n",
    "        if (magic[try_row][try_col]==0):\n",
    "            row = try_row\n",
    "            col = try_col\n",
    "        else:\n",
    "            row = (row-1+n)%n\n",
    "        magic[row][col] = i\n",
    "    for x in magic:\n",
    "        print(x,sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[4, 9, 2]\n",
      "[3, 5, 7]\n",
      "[8, 1, 6]\n"
     ]
    }
   ],
   "source": [
    "magic_square(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[11, 18, 25, 2, 9]\n",
      "[10, 12, 19, 21, 3]\n",
      "[4, 6, 13, 20, 22]\n",
      "[23, 5, 7, 14, 16]\n",
      "[17, 24, 1, 8, 15]\n"
     ]
    }
   ],
   "source": [
    "magic_square(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex4：数独\n",
    "<img src=\"../images/ch02/sudoku.jpg\" width=\"200\"/> \n",
    "给一个填好的数独，验证是否正确。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "matrix = [\n",
    "    [5,3,4,6,7,8,9,1,2],\n",
    "    [6,7,2,1,9,5,3,4,8],\n",
    "    [1,9,8,3,4,2,5,6,7],\n",
    "    [8,5,9,7,6,1,4,2,3],\n",
    "    [4,2,6,8,5,3,7,9,1],\n",
    "    [7,1,3,9,2,4,8,5,6],\n",
    "    [9,6,1,5,3,7,2,8,4],\n",
    "    [2,8,7,4,1,9,6,3,5],\n",
    "    [3,4,5,2,8,6,1,7,9]\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sudoku(matrix):\n",
    "    n = len(matrix)\n",
    "    result_row = result_col=result_blk = 0\n",
    "    for i in range(n):\n",
    "        result_row = result_col=result_blk = 0\n",
    "        for j in range(n):\n",
    "            temp = matrix[i][j]\n",
    "            if (result_row & (1<<(temp-1))==0):\n",
    "                result_row = result_row | (1<<(temp-1))\n",
    "            else:\n",
    "                print(\"row:\",i,j)\n",
    "                return False\n",
    "            temp = matrix[j][i]\n",
    "            if (result_col & (1<<(temp-1))==0):\n",
    "                result_col = result_col | (1<<(temp-1))\n",
    "            else:\n",
    "                print(\"col:\",j,i)\n",
    "                return False\n",
    "            idx_row = (i//3)*3 +j//3\n",
    "            idx_col = (i%3) *3 +j%3\n",
    "            temp = matrix[idx_row][idx_col]\n",
    "            if ((result_blk & (1<<(temp-1)))==0):\n",
    "                result_blk = result_blk | (1<<(temp-1))\n",
    "            else:\n",
    "                print(\"block\",idx_row,idx_col)\n",
    "                return False\n",
    "                                           \n",
    "    return True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sudoku(matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex5：旋转数组\n",
    "给一个n×n的数组，旋转90度。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rotate(matrix):\n",
    "    n = len(matrix)\n",
    "    result = [[0]*n for i in range(n)]\n",
    "    for i in range(n):\n",
    "        for j in range(n):\n",
    "            result[j][n-1-i]=matrix[i][j]\n",
    "    for x in result:\n",
    "        print(x,sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[0, 1, 2, 3, 4],\n",
       " [5, 6, 7, 8, 9],\n",
       " [10, 11, 12, 13, 14],\n",
       " [15, 16, 17, 18, 19],\n",
       " [20, 21, 22, 23, 24]]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "matrix = [[i*5+j for j in range(5)] for i in range(5)]\n",
    "matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[20, 15, 10, 5, 0]\n",
      "[21, 16, 11, 6, 1]\n",
      "[22, 17, 12, 7, 2]\n",
      "[23, 18, 13, 8, 3]\n",
      "[24, 19, 14, 9, 4]\n"
     ]
    }
   ],
   "source": [
    "rotate(matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# in-place\n",
    "# import pdb\n",
    "def rotate_in_place(matrix):\n",
    "    n = len(matrix)\n",
    "    for layer in range(n//2):\n",
    "        frist = layer\n",
    "        last = n-1-layer\n",
    "#         pdb.set_trace()\n",
    "        for i in range(frist,last):\n",
    "            offset = i- frist\n",
    "            top = matrix[frist][i]\n",
    "            matrix[frist][i] = matrix[last-offset][frist]\n",
    "            \n",
    "            matrix[last-offset][frist] = matrix[last][last-offset]\n",
    "            matrix[last][last-offset] = matrix[i][last]\n",
    "            \n",
    "            matrix[i][last] = top\n",
    "    for x in matrix:\n",
    "        print(x,sep=\" \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[20, 15, 10, 5, 0]\n",
      "[21, 16, 11, 6, 1]\n",
      "[22, 17, 12, 7, 2]\n",
      "[23, 18, 13, 8, 3]\n",
      "[24, 19, 14, 9, 4]\n"
     ]
    }
   ],
   "source": [
    "matrix = [[i*5+j for j in range(5)] for i in range(5)]\n",
    "rotate(matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[20, 15, 10, 5, 0]\n",
      "[21, 16, 11, 6, 1]\n",
      "[22, 17, 12, 7, 2]\n",
      "[23, 18, 13, 8, 3]\n",
      "[24, 19, 14, 9, 4]\n"
     ]
    }
   ],
   "source": [
    "rotate_in_place(matrix)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex6：反转字符串\n",
    "hello => olleh"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def reverse(s):\n",
    "    return s[::-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'olleh'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = \"hello\"\n",
    "r = reverse(s) # O(n)\n",
    "r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def reverse2(s):\n",
    "    li = list(s)\n",
    "    length = len(li)\n",
    "    for i in range(length//2):\n",
    "        li[i],li[length-i-1] =li[length-i-1],li[i]\n",
    "    print(li)\n",
    "    return ''.join(li)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['o', 'l', 'l', 'e', 'h']\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'olleh'"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = \"hello\"\n",
    "r = reverse2(s)\n",
    "r"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex7：最长连续子串\n",
    "给一个只包含0和1的数组，找出最长的全是1的子数组。\n",
    "\n",
    "Example:\n",
    "\n",
    "Input: [1,1,0,1,1,1]\n",
    "\n",
    "Output: 3\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "def find_consecutive_ones(nums):\n",
    "    local,maxmu = 0,0\n",
    "    for num in nums:\n",
    "        local= local+1 if num==1 else 0\n",
    "        maxmu = max(maxmu,local)\n",
    "    return maxmu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums = [1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,1]\n",
    "result = find_consecutive_ones(nums)\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex8：最大数\n",
    "给定一个数组，数组里有一个数组有且只有一个最大数，判断这个最大数是否是其他数的两倍或更大。如果存在这个数，则返回其index，否则返回-1。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# O(n) time\n",
    "# O(1) space\n",
    "def largest_twice(nums):\n",
    "    maxmu = second = idx = 0\n",
    "    for i in range(len(nums)):\n",
    "        if nums[i]>maxmu:\n",
    "            second = maxmu\n",
    "            maxmu = nums[i]\n",
    "            idx = i\n",
    "        elif nums[i]>second:\n",
    "            second = nums[i]\n",
    "    \n",
    "    return idx if (maxmu>=second*2) else -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums = [1, 2,3,8,3,2,1]\n",
    "result = largest_twice(nums)\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex9：Find All Numbers Disappeared in an Array\n",
    "\n",
    "\n",
    "Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.\n",
    "\n",
    "Find all the elements of [1, n] inclusive that do not appear in this array.\n",
    "\n",
    "Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.\n",
    "\n",
    "Example:\n",
    "\n",
    "Input: [4,3,2,7,8,2,3,1] \n",
    "\n",
    "Output: [5,6] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# O(n^2)\n",
    "def findDisappearedNumbers1(nums):\n",
    "    result = []\n",
    "    for i in range(1,len(nums)+1):\n",
    "        if (i in nums):\n",
    "            pass\n",
    "        else:\n",
    "            result.append(i)\n",
    "            \n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5, 6]\n"
     ]
    }
   ],
   "source": [
    "nums = [4,3,2,7,8,2,3,1]\n",
    "print(findDisappearedNumbers1(nums))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "def findDisappearedNumbersTest1(nums):\n",
    "    start = time.time()\n",
    "    r = findDisappearedNumbers1(nums)\n",
    "    t = time.time() -start\n",
    "    return r,len(nums),t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "import matplotlib.pyplot as plt\n",
    "import random\n",
    "import math\n",
    "%matplotlib inline  \n",
    "\n",
    "def random_list(l):\n",
    "    return [[i + 1 for i in range(l * n)] for n in range(1, 20)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[([], 100, 3.790855407714844e-05),\n",
       " ([], 200, 0.0001373291015625),\n",
       " ([], 300, 0.00030684471130371094),\n",
       " ([], 400, 0.0005440711975097656),\n",
       " ([], 500, 0.0008902549743652344),\n",
       " ([], 600, 0.0012183189392089844),\n",
       " ([], 700, 0.00182342529296875),\n",
       " ([], 800, 0.002316713333129883),\n",
       " ([], 900, 0.0029921531677246094),\n",
       " ([], 1000, 0.003597259521484375),\n",
       " ([], 1100, 0.004239559173583984),\n",
       " ([], 1200, 0.0050733089447021484),\n",
       " ([], 1300, 0.005866527557373047),\n",
       " ([], 1400, 0.006699085235595703),\n",
       " ([], 1500, 0.007865428924560547),\n",
       " ([], 1600, 0.009176254272460938),\n",
       " ([], 1700, 0.010252714157104492),\n",
       " ([], 1800, 0.011240720748901367),\n",
       " ([], 1900, 0.012468099594116211)]"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_lists = random_list(100)\n",
    "rst = [findDisappearedNumbersTest1(l) for l in random_lists]\n",
    "len(rst)\n",
    "rst"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f433e4ed9b0>]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = list(zip(*rst))[1]\n",
    "y = list(zip(*rst))[2]\n",
    "\n",
    "plt.plot(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def findDisappearedNumbers2(nums):\n",
    "    # For each number i in nums,\n",
    "    # we mark the number that i points as negative.\n",
    "    # Then we filter the list, get all the indexes\n",
    "    # who points to a positive number\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5, 6]\n"
     ]
    }
   ],
   "source": [
    "nums = [4,3,2,7,8,2,3,1]\n",
    "print(findDisappearedNumbers2(nums))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# O(n)\n",
    "def findDisappearedNumbersTest2(nums):\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[([], 100, 0.0),\n",
       " ([], 200, 0.0),\n",
       " ([], 300, 0.0),\n",
       " ([], 400, 0.0),\n",
       " ([], 500, 0.0009999275207519531),\n",
       " ([], 600, 0.0010001659393310547),\n",
       " ([], 700, 0.0009999275207519531),\n",
       " ([], 800, 0.0),\n",
       " ([], 900, 0.01399993896484375),\n",
       " ([], 1000, 0.0),\n",
       " ([], 1100, 0.0010001659393310547),\n",
       " ([], 1200, 0.0009999275207519531),\n",
       " ([], 1300, 0.0),\n",
       " ([], 1400, 0.0009999275207519531),\n",
       " ([], 1500, 0.0010001659393310547),\n",
       " ([], 1600, 0.0009999275207519531),\n",
       " ([], 1700, 0.0009999275207519531),\n",
       " ([], 1800, 0.0019998550415039062),\n",
       " ([], 1900, 0.0010004043579101562)]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_lists = random_list(100)\n",
    "rst = [findDisappearedNumbersTest2(l) for l in random_lists]\n",
    "len(rst)\n",
    "rst"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x530375f8>]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAD8CAYAAABpcuN4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXuQZPdV37+nH7dnuntXM9O9iLUe3jVZE9bYgNiSlRSv\nYIy1DrAGgksKKSmOU0JliQoFhMjlKsqpgsSQQFIKxiq5cJB5RCgPl7cKgWJUSaiiEHhtbNlrWdZa\ntpHEaqXu2d2Z7p7p24+TP+693Xd6em7fx+9xW3s+VVPbc/vennPvzP7O73fO75wvMTMEQRAE4SAK\ntg0QBEEQ8o04CkEQBCEScRSCIAhCJOIoBEEQhEjEUQiCIAiRiKMQBEEQIhFHIQiCIEQijkIQBEGI\nRByFIAiCEEnJtgEqaDabfOzYMdtmCIIgLBWf+cxnWsx8ZNF5rwlHcezYMZw7d862GYIgCEsFEX0j\nznkSehIEQRAiEUchCIIgRCKOQhAEQYhEHIUgCIIQiTgKQRAEIZJYjoKIbieiZ4noAhE9MOd9IqIH\n/fefJqJbFl1LRD9FROeJaExEp2Y+7/3++c8S0Tuy3KAgCIKQjYWOgoiKAD4M4DSAkwDuJKKTM6ed\nBnDC/7oHwEdiXPtFAD8B4M9nft5JAHcAeBOA2wH8tv85giAIggXi1FHcCuACMz8PAET0KIAzAL4U\nOucMgI+zp6v6FBGtEdFRAMcOupaZn/GPzf68MwAeZeY+gK8R0QXfhr9Md4uCSV683MP27hDfdvSw\nVTueubiFw6tl3LC2atWO//vsK3jLjWvYqDnWbBiPGWc//3fY3h1k+pxDK2X82He8DoXCvv+zxrjc\ndfH4Fy9iPM4m4czwngsDGDMQSEKPmcHsH4P3mmeOjRlAICFNhAIBBAIRvNfkvSb474Xep8n5QKFA\nUPEkX9+o4fveuLBmLhNxHMUNAF4Iff8igLfGOOeGmNfO+3lPzfmsPRDRPfBWL7j55psXfKRgin//\nJ1/Gsy9v489+/vut2nH/H34WJ193Hf7Lnd9lzYZuf4j3/O6n8QtvfyPu/8ET1ux4+qWr+Lk/+pyS\nz3rDkRrecuOaks9Kw+8/9Q38xqe+Yu3n55EfecvRXDiKXMLMDwN4GABOnTqVbXohKOPS1V1c2tq1\nbQYubfXRqNu1o91xwQy8st23ascr/u/jD/7lW/Gt33wo1Wd8+eI2/tnv/BVe2bJ8L9t9XLdaxpO/\nkH0iUgitBhBaDRT2rADCK4Ppv2GYebIq8VYowUpkugIJ3uPx9NiY1QxbTkn/nqQ4juIlADeFvr/R\nPxbnnHKMa9P8PCGntLsutneH6A9HqJTspJZ2ByN0+kO0O3YHtVbX+/ntjmvVjnbX+/lvOFJDs15J\n9RnHj4z9z7L7TNvdPpp1J/V96ICIUCQASgJJ+SSOK/o0gBNEdJyIHHiJ5rMz55wFcJe/++k2AFeZ\n+WLMa2c5C+AOIqoQ0XF4CfK/TnBPgkVa/uC82bU3OAYDY9uiDcDUQbQsO6zAYWbJkzT8a1uWnV6r\n46KRIydxrbDQUTDzEMD9AJ4A8AyAx5j5PBHdS0T3+qc9DuB5ABcAfBTA+6KuBQAi+nEiehHAPwDw\nx0T0hH/NeQCPwUuW/ymA+5h5pOh+BY30hyNs7w4B2J1FBwPjld4Ag9HYuh22HVar4+LQSinTCm+l\nXES9UrK/Oup4KwrBLLFyFMz8ODxnED72UOg1A7gv7rX+8U8A+MQB1/wqgF+NY5uQH8KrCJuz6PBg\ndrnr4psOr9ixI1jZ2F5RdF0loZpG3clB6MlFoyYrCtNIZbagjPAAbXPmGXZSNkMlgR2XewMMLa9s\nGgq25zZqjtXf62A0xpXeAA1ZURhHHIWgjPAAbXPmGQ71WLUjNKhu9myG4lwlg2ujXrG6Urzs/14l\nR2EecRSCMvKyogiHeqza0c2PHSoG12bdsZpvCVaHTYvFi9cq4igEZQQD46GVktWQT9tP3gL2cyWH\nfTtsOYrRmLHZdZUMro1aBZtdN3NVdFqCvy9ZUZhHHIWgjHbHhVMs4PWNqtWQT6vr4nizhnKRrM+A\ngwI3W8/jSs/FmNUMro26g9GYcXUnWyuQtATOVnIU5hFHISij3fVi4c16xW4dRaePZr2CjZpjbcfR\neMy43HPxxut9R2FpRdHuqhtcA2djy+kF99KUXU/GEUchKKPd6aNRd9CoVazG5De7Lho1ZxIqscHV\nnQFGY8bxZg2lAtkbXP3fg4qmhMHOKWtOr9NHqUA4vLq0nYeWFnEUgjKCPe7NuoNWpz/pyGkSZvZ3\n+VTQqDvWciWBYzhyKFjZ2LVDVR2F95m2HIWLjZozr+O0oBlxFIIygm2YjbqD/nCMrmu+oH67P4Q7\nGk/6AdmayU926NQr/rZSe4MrAEV1FH7oyVI4T9XuLSE54igEJTAzWn5uwOaAEk542iwQC9vRtFjR\n3O70USBgrZrdUaxXyyCyV8TY6rjSvsMS4igEJXTdEfrDsZcbqNtrIBc4p0bNm8n33BF67tC8Hd2Q\nHRYdVqvrhWuKCsSGSsUC1qsWnV5XTYW5kBxxFIISJgN0vTKJh9tYUbTCK4q6veRrq+OCyJuFN+oV\ne+GaTl9pbyTbqzQJPdlBHIWghLkDtIWkZzh527RpR6eP9aqDUrGARt1B1x1hx0LORlX7joBG3Y6j\n6LlD9NyR1FBYQhyFoIRgxtysVSZbMW3mKNarjvVcSRAmmWwrtRCy8WpbFK4o6pWJIJNJgt+r1FDY\nQRyFoIRwYVelVMShip02Hu1OH4dXSnBKBauhp3a3P3GYU4dlIwSmNq7ftBR6Ulk4KCRHHIWghFkV\ntYalBnKtkPZCMEBbmQGH7fAHN9PFf4GQlMqdQo16BVd3BnCHZtumh3NggnnEUQhKaHdd1CslrJQ9\nFbVGvYJNKyGK/mRgXnWKqDpFOzPgUG4gcBimGxRuamjLHdzTZcNt0ycrCtn1ZAVxFIISZpOmtnbH\nbM4ooDXqjvGZvDsc4+rOYGKHreS+yvYdAbbaeEhDQLuIoxCUMLvH3VY18n6HZV5sJ5htB3ZUnRJW\ny0XjSfVJEz3FoSfvsw3fS6eP1XIRVUf6PNlAHIWghNk97s26g81u36h2wWjM2Oztt8P07DdwTOEB\n2sa20nDxoSqsrSi6arf5CskQRyEoYba9QqPmYMzAFYPaBZd7LphnBuia+X5P0zBJOARWQctS6Elt\nHYWdfEurI32ebCKOQsjMeMzY7PZncgPmaximDfD25ijaHddoJ9tp+47pAN20oI3R6vbhlAqoV9SF\naw6vlKwIQrU7alT6hHSIoxAyc2Vn4Kuo7Q21AGb7PU23UO7NlQzHjK0dc/2e5q8obISevMFVZVtu\nIvL1RkznW/oSerKIOAohM/P2uDctJD1bc5K3wWuTtRStjotykSZ62QCw4YfAjK5sNIVrTDu9sMaI\nYAdxFEJmJtoLtb05CsBs0nNe8tZGVXS7098nsNOsOxiMGFu7Blc2mhLApvMtWztDDMcsNRQWEUch\nZGYSkw/N+NaqDojM5yiKBcJ1q+XJsWkbD3N2zNZyhO0wWdPh9ZtSPws3nW9pKVTpE9IhjkLITDD4\nhQu7igXCRtUxOvNsd72OrYWQ9kIwCzVpR2vOTN50g8KpkJSOFYXZ0JMU29lHHIWQmbD2QphG3cGm\nwQFlngLauoVOtm1f6S+M6eR+ICSlsio7YKNWwc7AnCDUZld9PYiQDHEUQmbC2gthTNcwhPs8BZSL\nBaxVy8ZnwLPxdNPJfZ1N9Ex35Z3qj8uKwhbiKITMzBsYAfMhinm5AcALP5nKDfTcIXYGo30D9HrV\n7OCqsy23aUGoicaIJLOtEctRENHtRPQsEV0gogfmvE9E9KD//tNEdMuia4log4g+RUTP+f+u+8fL\nRPQIEX2BiJ4hoveruFFBHwftcW/WzfZZOkjNrWHQjoPi6U6pgOtWy8ZCYDqFfkznW9rdPq5bLaNc\nlHmtLRY+eSIqAvgwgNMATgK4k4hOzpx2GsAJ/+seAB+Jce0DAJ5k5hMAnvS/B4CfAlBh5jcD+G4A\nP0NEx1Len2CAg/a4N2oOtnaHRrQLdgcjbPeHc3fGNA1qY8zr8xTQqJtL7s8rPlSF6dCTajlXITlx\nXPStAC4w8/PM7AJ4FMCZmXPOAPg4ezwFYI2Iji649gyAR/zXjwB4l/+aAdSIqARgFYALYCvd7Qkm\naHX6c9srBM7DRNhnM0KvwGQl8bw2IgFNk3bM2YmmCtOCUN7flySybRLHUdwA4IXQ9y/6x+KcE3Xt\n9cx80X/9MoDr/df/A0AXwEUAfwvgPzLzZgw7BQu4wzG2dofzVxSTnT76B5R5bTPCdlzuDTAc6V/Z\nTGtK9g/QGwY1OlqdPg6FhKRUsuoUUTMoCCWdY+2Ti6Afe30Ngt4GtwIYAXgdgOMAfoGI3jB7DRHd\nQ0TniOjcq6++as5YYQ+bEUlTk0nPVsQAPVnZGFBla0WsKEzKw+oO1zTqJldp0ufJNnEcxUsAbgp9\nf6N/LM45Udde8sNT8P99xT/+TwH8KTMPmPkVAH8B4NSsUcz8MDOfYuZTR44ciXEbgg5ac9pmBJhM\nekYlb5sG24lsdl1UnSJWnf0z+Ua9gss9FyMDGh3eBgN94RpTTm84GuNybyA1FJaJ4yg+DeAEER0n\nIgfAHQDOzpxzFsBd/u6n2wBc9cNKUdeeBXC3//puAJ/0X/8tgB8EACKqAbgNwJdT3Z2gnSgVtQ2D\nSc/AGW1ErChM2XHQ7LdZd8BsRm/6oC3LqvCUAw043p7UUOSBhY6CmYcA7gfwBIBnADzGzOeJ6F4i\nutc/7XEAzwO4AOCjAN4Xda1/zYcAvJ2IngPwQ/73gLdLqk5E5+E5mv/KzE9nvlNBC5tz+jwFHKqU\n4BQLRmae7a6LSqmA2tyZfBACM7CyOaCWAzDboLCluduqpxyo/3lOQ5uyorBJLEUTZn4cnjMIH3so\n9JoB3Bf3Wv94G8Db5hzvwNsiKywBwaA3b3cNEflFd/oHlJbfNmOe9sKk35OhAfqGtZW57+1tUHhI\nmw1TISl9s/ANv4hxPOY9vbVUM91FJisKm+QimS0sL/O0F8KYimVHJW8Pr5RRKpChXEn/wBXFVBtD\n7/OYJySlmokg1K5eqduWxlYkQnzEUQiZCAbGg1TUTNUweO075g+MhQJNZsA68WbyBzssU8n9qHCg\nKkztaJMVRT4QRyFkYtEe90bdMRLyWaTm5rXx0GvH1u7AE9g5wI7rVssoFkh7jmKekJRqTOVb2t3+\nPo0RwTziKIRMLBqgm3X9EqDMPFcDYq8djvZk9qIup8HKRrcdUcWHqjAlCNXuuNioOVrzIMJixFEI\nmWh13MiZa6PmYHcwRs8dabOh0/f6SUW1eWgYqIqeJ8U6zw7dK5uo6nBVNAzlW1qat/kK8RBHIaSG\nmQ/sHBtgooYhjgKaiUriOK29TewCmwpJadz1VDW0oujuF4ESzCOOQkhNzx1hdzBekBsIZp76BpR5\nmt3z7Oi6I+xoXNnEchS1ivakervTx0bVQVFjuKZULGDdgCCUdI7NB+IohNTE2ZHSMNA+oxXDjiAs\npTM/EMyuo2byJsScTA2ujbp+BcOo7caCOcRRCKkJBomo0MA09KRzgI4X8gmfq8uOtWq0wE6zXsF2\nf4jdgc6VjZnBVXe+ZXcwQtcdyYoiB4ijEFITa4Cu6d9vP+nzFLWyMaBZ3Y5RDR28rzP81O64c3te\nqUZ3viWqj5hgFnEUQmqCQTdqgF4pF1GvlPTO5LsuDq2UUCkdrL1goo1HnP5KJpL7BwlJqaZRqxiZ\nAEjoyT7iKITURGkvhGlormEI+jwtsgHQHXrqL5z96k7uRwlJqaZRd3ClN8BAkyBUnBWrYAZxFEJq\n2h0XtQO0F8LormGIat8RUHVKWC0XJ+0tdBDVOTagqbmiOWhhbiqZHf6ZqonSOhHMIo5CSE1ccRyv\nfYbeZHacgVHnjqPBaIwrvcFCO3RXNJscXHULQsXZbiyYQRyFkJq4A3RTcwfZRA5Lkx2XY+omVJ0i\nVsr6NDomSn8GVxTaHEWnj5VyAdUFK1ZBP+IohNS0Yu5xD4rMxhokQEd+x9Y4ydtmTd8unbiN+IjI\nV4fTY0ec4kNV6BaE8lT6Du5MLJhDHIWQmnbXjTVzbdQdjMaMqzvqtQuu9FxfeyHOikJf6CnJAK3V\nDoMJ4CDfomsnWSvm35egH3EUQioWaS+E0VnDkCSO3dDYyXYziR0atTFaHRdOsYBDlVjilZk4vFrS\nKgi1qDOxYA5xFEIqru4MMBpzzNCTvhqGVoxiu7AdgxFja3eowY74Ajs6GxR6g6tjJFwzlbrVtzqS\nzrH5QByFkIpkM3l9u2OmydvFDqupsZ1Iu9NHqUA4vLJYYKdRd9DqulpWNouEpFTjFd2pf57TzsSy\nosgD4iiEVASDbZwBOlh16KhhmFbvJnBYGsI+SQR2mrUK3OEYnb76lU2708eGwboDXQqG2/0hBiOW\nHEVOEEchpCIYbOOEfNarZRDpCT21uy4KBKzF0F7YqOmrYUgy+9W5wlokJKWahibFPqnKzhfiKIRU\nTGbyMf4je9oFegaUlj+Tj6O9EKx+9ORK4u/Q0ZXcjyMkpRov36JjhSZV2XlCHIWQimCw3Yipoqar\njUcSvYL1qsZcSYzOsQG6kvtxhKRU06g76GkQhGrJiiJXiKMQUtHu9rFeLaMUob0QRtfumLhbdAHA\nKRVw3WpZU65kcefYgKamiubJFl2DoSddglCTuhRZUeQCcRRCKpIMjEDQPkNPHUUyOxzlbTx67hC9\nBAI76zVvZ5TqXEkrwQYDVejKtwSfFycHJuhHHIWQiqR73JuaQk9eG5EkdqivYZhs0Y05+62Uiji0\nUlK++8pGAlhXvqXd6ePwSglOSYaoPCC/BSEVre5iDYgwjXoFV3cGcIfqtAv6wxG2d4eJtlDqCIEl\nqcoOaNbVi/6Y7PMUoCvf4rXvkLBTXhBHIaQibufYgOBcldoFmzE7ts7aoWuAThImaWhoUJikOlwV\n+kJPZndvCdGIoxASMxiNcXVnkCjROJ15qhsc08SxG7UKLvdcDBWqsrUSVIdP7NCwsml3XNQrJayU\nzbXlrjolVJ2ilnCeJLLzgzgKITGXU4RadGgXTJO3SUI+DpiByz11nWzT5AaCBoUqMV1DEaBnlWa2\nFYkQTSxHQUS3E9GzRHSBiB6Y8z4R0YP++08T0S2LriWiDSL6FBE95/+7HnrvLUT0l0R0noi+QEQr\nWW9UUMd0Bp0s1AJAadfUyQCdZGWjIfna7vSxWi6i6sTv2Nr0O8iOFGp0BG1ETLOhWF9jNGZc7iXb\nzSboZaGjIKIigA8DOA3gJIA7iejkzGmnAZzwv+4B8JEY1z4A4ElmPgHgSf97EFEJwO8DuJeZ3wTg\nBwCoFzIQUpMmadqYVEUrHKC78avDJ3ZokO9MM/tt1CsYs6enoYq4QlKqUb2j7XLPBbMZlT4hHnFW\nFLcCuMDMzzOzC+BRAGdmzjkD4OPs8RSANSI6uuDaMwAe8V8/AuBd/usfBvA0M38eAJi5zcxqyz6F\nTKTJDRxeKaFcJKUhinbHhVMqoJ5AeyEY0FU6rFYK3QQdDQrjCkmpxgs9qc89SY4iP8RxFDcAeCH0\n/Yv+sTjnRF17PTNf9F+/DOB6//UbATARPUFEnyWiX5pnFBHdQ0TniOjcq6++GuM2BFVMcgMJ/iMH\nEqAqk55BA7wk2gvB4KN0RZGiEV+jpnaFlURISjWNuid1q6ptepI+YoIZcpHMZu8vLPgrKwH4HgA/\n7f/740T0tjnXPMzMp5j51JEjR8wZK6DddT3thdVkKmqqd/psptAruG61jGKB1OZKUiSRVW8r3dqN\nLySlGtWCUC0LrUiEaOI4ipcA3BT6/kb/WJxzoq695Ien4P/7in/8RQB/zswtZu4BeBzALRByQ1oV\nNa+Nh93cQKFA2FDYGps5mMknDD0pbnlus4meakGo6YpCQk95IY6j+DSAE0R0nIgcAHcAODtzzlkA\nd/m7n24DcNUPK0VdexbA3f7ruwF80n/9BIA3E1HVT2x/P4Avpbw/QQNp97g3FReZpbWjUVMntrO1\n6wnsJJ39rlUdFEjdLrAkQlKqUZ1vaXd8jZHVxWqBghkWxg6YeUhE98MbwIsAPsbM54noXv/9h+DN\n+t8J4AKAHoD3RF3rf/SHADxGRO8F8A0A7/avuUxEvwnPyTCAx5n5j1XdsJCdVspYuMrQEzOj1emn\nSt42FWpWpx2gi/7KRtUKK4k0rWqmeR9Fz7TrqfTFUQsUzBAryMzMj8NzBuFjD4VeM4D74l7rH28D\n2Jd78N/7fXhbZIUc0u708YZmLfF1G7UKdgYj9NxhopqDeXTdEfrDcaq6gUbdwQsv9DL9/IAkSn/7\n7FCY3Lcp9NOc7CRT4/SSiEAJZshFMltYLja7yTrHBqhM4GaJY3sDtNqQj+0VVqvjgsiTnTXNuuLa\nFOnzlD/EUQiJmGovpMhRKIxlZ0neNuoOOv0hdgfZy3PS9Hma2qGug2y728faanwhKZWUi54glKoN\nAt5ERBLZeUIchZCILJoHKmPZ7RS1HAEqHVbwPNZjSsKG8ZLqqkJPdlteqFwdJe1MLOhHHIWQiGBw\nTRNDVhp6ypC8Veqwun1ct1pOJbDTrDvY3h2iP8y+skkqJKWapqJ+T7uDEbb7Q9GiyBniKIREBIPr\nRqptqX41soIQxdSO5IPjhtJcSfrZb7ACULFFNqmQlGpUdZC1ofstLEYchZCIaR+e5P+RV50iak5R\nyQDd6rg4lFJ7oamwfUar008V/gKmTs62w1KBF3pSMQFILkYl6EcchZCIVoqOrWEaimoYsvQ1Cq5T\nMZPPopsw3Vaa7XmkEZJSTaNWwZWdQWZBqFYKtUBBP+IohES0Oy6qTjLthTCqQhTtFH2eAqpOESvl\ngrJQSWqHVVMTekojJKUaVYJQ7U76HJigD3EUQiKy7nFv1CpKCrOyJG+DTrZZZ/LD0dgT2Ek5k1eV\n3E8jJKUaVYJQ0ucpn4ijEBLRzrjHvakolt3KuB20qWA75+XeIJPATr1SglMqZE7upxGSUo0qQah2\n10WlVEDNMaf7LSxGHIWQiHbG9gobvgToOIMEqKe90M+0M0aFZnW7m34HGOCtbFSow2XZYKAKVQqG\nXv+uSuLOxIJexFEIiWh3s8ltNuoVDMeMrd30sewrOwOMOVtMvqFygM5ih4LkfisH4ZqmojCa7d1b\nwnzEUQixYebM/5FVVEWriGN7A3Q2VbaJ0l8mR5E9ud/uuigXCYdXsjVazMLhFU8QKusqLW0fMUEv\n4iiE2GztDDEcc7YBWoEU6SR5m2FAadYduKMxtvvpVdlUaDuraFDY7vSxkVASVjUTQSgF9yKJ7Pwh\njkKITZB0zTqDBrK1z1CRvFWx46jd7aNYIFyXQWCnWff6PWVZ2aQVcFJNVkEoZk6tdSLoRRyFEJtg\nUM1SDBUMAlkEe1TkBjYU9Htqd1xs1JxMAjsbNQf94RhdN32/p7wMrs2MGwQ6/SHc4Th1pbugD3EU\nQmxUiONsVBWsKDp9X3shWzIbyCa201LQiK+hQG+63bHb5ykgawdZFRMAQQ/iKITYtDJ0jg0oFQtY\nr5az5Si6LjaqDooZZvJNBQVimwoa8anQm7bdOTYgq2JfW9p35BZxFEJsgkFgXcEsOtMArWALZTAY\nbWbKUWS3o5kxud9zh9gZpBOSUk2j7qDrjlILQmURgRL0Io5CiE2742KtWkY5o4pa1qRn1loOAHBK\nBRxeKSmYyStaUaSciecpXJN163Oe7kXYizgKITbtjNXQAc2MRWaqirKa9fT9nnYHI3T6Q2Urm9SD\nq4JwoCqyCkJl0RgR9CKOQoiNKrnNjVq2IrNWR43DypJ8bSsS2FkpF3GoUkrtsFRsMFBF1i3H7a6L\nQyslVErS5ylviKMQYtPuZuvzFNCoO7jSG2CQQrvAHY6xtTtU4rAatfS5EpVdTjM5LAVbllXRyCgI\n1crJ7i1hP+IohNi0O9lzA8B0cL3cSz44birUXlAxQKuxI73DyiokpZKsO7ikfUd+EUchxMLTXhio\nyQ1kaEndUhhqadQr2Oy5GKXoZDvp86TCjgytL7IKSalkIgiVITGfB4cn7EcchRCLzZ46LeNpkVny\nwVFl8naqypbeDlUrm7S7wLIKSakkEIRKn6OQPk95RRyFEIuJRKWiJDKQrthNaW4gQw1Du9PHSrmA\nqgKBnUatgsu9dBodWYWkVNOsO6nas4zGjM2uq+TvS1CPOAohFiqTps1J0jPNAK1uJj/ZmpoiVBIM\n0Co6tjbqDkZjxtWd5BodrYxCUqpJq69xpef6GiP5cXrCFHEUQixUym0eXi2hVKBUA0qr24dTLOBQ\nJXtMPhhg08yAsyr9hcmiN61qg4Eq0uZbglBeHnZvCfsRRyHEYtpeIft/ZCJKveMoaN+hZiZf8T8z\nzYpCXTy9mbJBIbMXrslLjgLwNwh0kwtCTVX68nMvwpRYjoKIbieiZ4noAhE9MOd9IqIH/fefJqJb\nFl1LRBtE9Ckies7/d33mM28mog4R/WKWGxTU0O70USoQDq+k114Ik7aGQUV/pYC11TIKlG47p8pG\nfGmT+yqEpFSTVhBqkgPL0b0IUxY6CiIqAvgwgNMATgK4k4hOzpx2GsAJ/+seAB+Jce0DAJ5k5hMA\nnvS/D/ObAP4kxT0JGlChvRAm7U4fT81NzWDiqbJVUs3k2x0XG8pCT+mS+yqEpFSTtjp7WmGen3sR\npsRZUdwK4AIzP8/MLoBHAZyZOecMgI+zx1MA1ojo6IJrzwB4xH/9CIB3BR9GRO8C8DUA51Pel6AY\nbyavbrbXqDmpVhStjtqdMc26kzhXst0fwh2pE9hZrzogSh56UiHFqpq0/Z7aXRcFAtYyaIwI+ojj\nKG4A8ELo+xf9Y3HOibr2ema+6L9+GcD1AEBEdQD/BsC/jWGbYIh2t6905tqoVxK3+GZmPzeg0o7k\nfadUdzktFggb1eQOK49N9DZS5lvaXW/FmkVjRNBHLpLZ7GW+guzXBwH8J2buRF1DRPcQ0TkiOvfq\nq6/qNvFdHYBdAAAYp0lEQVSaR7U4TqBdsJNAArTnjrA7GCte2STfzqmylmNiR4rkvgohKdWkFYTK\n2+4tYS9x9hi+BOCm0Pc3+sfinFOOuPYSER1l5ot+mOoV//hbAfwTIvp1AGsAxkS0y8y/Ff6BzPww\ngIcB4NSpU+mV6YVYeBXA6v4jTwR7un3c6FRj2qCmY2uYVAO0DjtSJPdVCUmpZCNlexZp35Fv4qwo\nPg3gBBEdJyIHwB0Azs6ccxbAXf7up9sAXPXDSlHXngVwt//6bgCfBABm/l5mPsbMxwD8ZwD/btZJ\nCGbZcUfouiPlIR8g2YAyTd4qdFj1Crb7w0SqbG0NdmykcFiqhKRUMhGESpGjyNPuLWEvC1cUzDwk\novsBPAGgCOBjzHyeiO71338IwOMA3gngAoAegPdEXet/9IcAPEZE7wXwDQDvVnpngjImA6PC0ECa\nIjMdCmjBqmCz6+J1a6uxrglyKypzA80UGh2qhKRU06xXEhcxqtIYEfQQq7yVmR+H5wzCxx4KvWYA\n98W91j/eBvC2BT/3g3HsE/SiQ/OgkSLpqSM3EA6VxHUU7a6LwyslOCV1M/lGvYKrOwO4w3Hsz20p\nEpJSTSPhTrL+cITt3WGuci3CXvKzZhVyS1uD5kGa0JMqVbm9dvh9pxKsbHQI7ATPI0kn23ZH7U40\nVSTtILs5ad+RP6cneIijEBbS0lA1W3VKqDrFRDPPdsdFvVLCSlmdVGYw0CbZqqsj8ZpGHW4zZ51j\nAxp1ZzL4x0FHSFFQizgKYSG6/iMnrWFQXUPh2ZAiV9JVv5WzmXCFpVJISjVJBaEmIlA5vBfBQxyF\nsJDNbh+rZfUqal77jGQrCtXFZTWniEqpkCwEprB9R0BSh6VSSEo1SQWh8lhhLuxFHIWwEF173JsJ\nW1K3NBRlEZG3SyemHaMxY7OnXmAnac5GR02JKpLWUujIgQlqEUchLKSlaY974lh2V49IjxcCizeT\nv9xzwRoEdg5VSnCKhdgOK8+OImm/p3bXhVMqoK5AY0TQgzgKYSHtTl+LRGWj7lUjx9EuGI/1aS8k\nEdvRla+ZanTEHVzVbxVWRVJBqLbf6FGFxoigB3EUwkJ0hZ4aNQeDEWNrd7F2wdWdAUZj1hLHTiLf\nOW2Hrd6OjQRFdyqFpFQz1deI/0zz6PCEKeIohEimHVvV/0duJhhQdMaxG3UHrZiqbG2Njfi8FVbc\nWbhaISmVTAShYucopM9T3hFHIUSytTvEYMRaYuFTwZ7FA4qOWo6AZq0CdzhGJ4Yqm47q8KkdCUJP\nioWkVBIIQsXN+3idiWVFkWfEUQiRTAdGHaGnBCsKjUVZSXbpTAR2VtXP5JN0stW1ylNFM6aCITP7\nle6yosgz4iiESKZtM3SEnuL3e5qEnrTkKOJLkbY6LjZqFS0z+Ua9gp3BCD138cqm1dGzA0wVcRPz\nXXeE/nCcK/ElYT/iKIRIdK4o1hPM5FsdF0TAelX9TD4IZ8VyWBpnv41EK5t8d1v19DXiPU8gn7u3\nhCniKIRIdOYGysUC1qrlWDP5zW4f61UHJQ3aC4ETjFPToTPxOnVYMZ5HTjvHBjTqTqz+WS2NIUVB\nHeIohEiCwXNdk+j9RswaBh3tO8I2eD8jTq6kr63LadzqbB1CUqqJKwgVPHOVWieCesRRCJG0O31c\nt1pWqr0Qphmz35Nqze4wlVIRh1ZKMUNP+uyI2+9pmq/Jr6MInO+iVdokB5ZjpyeIoxAW0NK8xz1u\nG49WV70GRJhmjBqG3cEI2319AjtxxZyWoYle3HzLVItCHEWeEUchROK179A3IMVtNa6rOnxiR4wa\nhs3J7FfP81gpF1FzigsH12VoohdXEKrV6eOQYo0RQT3iKIRI9A/QFVzuuRiOxgee4w7HuLoz0DqD\njlPDsKlBYW+/HRVsLhxc9W0wUEVcfQ3df1+CGsRRCJHobq8w1S4YHHjO5Z7+OHbQoDCKloGtnHFW\nWMugCBe331PeCwcFD3EUwoF4Kmp62yvESeCaUEBr1rxcSZQqW3syk9e7wlqco9AjJKWSiSBUDKeX\n56S84CGOQjiQy70BmHUPjItDFNMZtF6HNWbgSoQqm4nW3s0YFc3L0ERvKgi1OIwmK4r8I45COJBg\nYNRVNwCEkp4RA4qJ7aCTWoqIGXC746JSKqDm6Eu8BrvAxhErm9aStOVelPfxNEakz9MyII5COBAT\nsfA4SU8zK4pga2pUCMxFs17RKrDTqFUwHDO2dg/O2QRCP3mnUYtWDryyM8CYZWvsMiCOQjgQndoL\nAYdXyigVKHJAaXddlIuEwyv6YvLBDqKomo52t699UJs6rIPt0KX0p5pGvRLZxkP6PC0P4iiEA9Gp\n5hZQKBDWF7Tx8Npm6JXKjJsr0T1ALxJzCoSkdIYDVdGoRQtCTbb5yooi94ijEA6k3XFRLBCu06C9\nEKaxQALUhLDNWtXxVdkiVjadvnY7Fok5BUJSyxDXb9SdSEEo3QWMgjrEUQgHEoRadKuoNRdoVutu\nIwIAxQJhw58Bz4OZ0erq14BY1KBQZ9t31UyFqeY/02WoMBc8xFEIB9IytMd9UZGZpwGhf9bZqB3s\nsDr9IdzhWPugtlGNzlHoFJJSzSJBqKnGiDiKvCOOQjgQswP0otCTIYd1gB2bhgboUrGA9Wr5wKT6\nMq0oFglCtTt9bFQdFHOo+y3sRRyFcCCmCrsadQedA7QLeu4QO4ORkTh2I6KDrEmBnah2IsvQ5ylg\nkb6G9HlaHmI5CiK6nYieJaILRPTAnPeJiB7033+aiG5ZdC0RbRDRp4joOf/fdf/424noM0T0Bf/f\nH1Rxo0JyTCSRgVAtxZxB2mRfo0bNObCOYiKwY2SF5UTMwvUKSalkYb6lq39zgKCGhY6CiIoAPgzg\nNICTAO4kopMzp50GcML/ugfAR2Jc+wCAJ5n5BIAn/e8BoAXgR5n5zQDuBvB7qe9OSM3uYIROf2ho\ngD54S6iJPk8BzbqD7d0h+sP9KxuTAjtRyf12V6+QlEoCQaiDVmmyolge4vy13QrgAjM/z8wugEcB\nnJk55wyAj7PHUwDWiOjogmvPAHjEf/0IgHcBADP/DTP/nX/8PIBVIpJph2HaBlpqB0SFKEyK9AS1\nCfPyA8HAbaKKOCq5v2yDa1S/p5ahHJiQnTiO4gYAL4S+f9E/FuecqGuvZ+aL/uuXAVw/52f/JIDP\nMvO+vzQiuoeIzhHRuVdffTXGbQhJMFk124zo92RyC2WUw2p1XBxaKaFS0i+w06hVcKU3wGCORkdL\ns5CUahoHFFO6wzG2dofSvmNJyMX6lb3SzT3lm0T0JgC/BuBnDrjmYWY+xcynjhw5YsDKawuToZao\nhnwmt4NG5kq65tphB8/88hw7lqV9R8BBUrebBv++hOzEcRQvAbgp9P2N/rE450Rde8kPT8H/95Xg\nJCK6EcAnANzFzF+NYaOgmIn2goEBuuoUsVIuzI3Ltzsuqk4Rqxo7tgZE5UraBju2Bg5rXkK73XWX\naha+UZu/g6tloD2MoI44juLTAE4Q0XEicgDcAeDszDlnAdzl7366DcBVP6wUde1ZeMlq+P9+EgCI\naA3AHwN4gJn/IsO9CRkwuV+fiLxaigNyA6ZmnYtyJaZWFEGuZHaAnQhJLVFcv1mfLwgVrCiWoRWJ\nEMNRMPMQwP0AngDwDIDHmPk8Ed1LRPf6pz0O4HkAFwB8FMD7oq71r/kQgLcT0XMAfsj/Hv75fw/A\nLxPR5/yvb8p+q0IS2l0XK+UCqgZm8kAg2HNQyMfMwFivlOCUCmjNmQGblOw8yGGZEJJSTaPmzBWE\nMiECJagjVt9mZn4cnjMIH3so9JoB3Bf3Wv94G8Db5hz/FQC/EscuQR8tvwGezo6tYRr1Cl7Z3p1j\nh4sb1laM2EBEaM5JvnoCO/r7PAU0JyuKAwbXJQrXTKVu966ElkH3W5iSi2S2kD/aHXMDI3Dw7hgT\nHVv32DGnhiEQ2DEVejq8WvI0OmbsWMbB9SBBqFbHhVMs4FAlv7rfwhRxFMJcTIZagGCA3qtdEMzk\nTQ6M82oYTAvsENHcvlMmiw9VMdXX2P9MG3W9GiOCOsRRCHMxmbwFvMHPHY2xHdIu2NodYDhmsw5r\nToNCk32e9tjRPWBFsUyhpwPaeJjqIyaoQRyFsA9m9iuATa4o9idwpw3wzDqsVqe/Z2UTDNgmq4gb\n9f39ntrdvhEhKZVMBKHmrNKWyeFd64ijEPax3R/CHY2Nrijm1TCYkGKdZaPmoD8co+tO+z1NZ/Im\nHdb8FYUJISmVTASh5qzSZEWxPIijEPaxaSPUMqfIzGR1+NSO+Q6rQN7s2Jgdc5L7poSkVDMrCBXo\nfi/jvVyriKMQ9mFjj3tjTpHZdEVh12G1ui7WDQvsNOoV9NwReu40Z+NtMFi+wXVjRhO9546wOxhL\nDcUSIY5C2EfLQqhlql2wf0WxbjLkM6eDrMnq8IDGnOexabD4UCWz/Z5shPKEbIijEPYx6fNkcMbn\nlAo4vFLaN6CsVcsoF839mU6T6uGVjfkBeqo3vfd5LOOKYrbVuI3NAUI2xFEI+zCpvRBm3oBietY5\nr5OtjY6tQVhm0x9UAyGpZRxcG7W9glDLWDh4rSOOQthHu+vi8ErJuIrabJFZy/AWXQBYKRdxqFLa\n47BsCOwEDjIIA5oUklLN1OkF9yJ9npYNcRTCPmwpj80WmbU7fStVyGGHFQjsmB6gZ+tKTFeHq2T2\nXmzkwIRsiKMQ9mErFj67ojDZOXavHVOHNRXYMWtH1Smh6hQnDmKZwzVTfY3pvdQrJayUzXQmFrIj\njkLYh5cbsDNAb/Y87YLBaIwrvYEdhxWqYWgZ1OXYZ0eo79Skz9My7nqq7e33tKzbfK9lxFEI+7C1\nomjWHTADl3vuRAbURqilUa/syw1YCYHVpsl9G8WHqpju4JquKCTstFyIoxD2MBozNi2pqIVnnpM+\nTxYGFE+VrY/xmK20EQnbEc5RmBSSUkkgCBVepS1jruVaRhyFsIcrPRdsUHshTLiGwebOmI1AlW1n\nYDU3EE7uB7Ucy9iWOxCECq/SZEWxXIhqiLAHmyGOyZbQrouxr7FsupYD2NvvqdXtwykWULcgsBMk\n95kZrSVvy71Rd9D2V2k26lKEbIijEPbQshhqCQ/Qvp+wkhtohorugnyNjZn8Rs3BcMzY2hlis9vH\nkSUO1zRqFWx2XVzdGWA05qVsRXItI6EnYQ/T9h3mB+i11TIK5G1JbXf6KBUIh1fMay80QqpsNme/\nE3W4bt+4PohqgtXRMiflr2VkRSHswWZhV6FA2Kh5O47GY7amvRDepWNTYCfcyXZZ+zwFBO1ZpnKu\ny+v0rkXEUQh7aHddT3vBkoqat9OnjzGblUANs151QOQN0K2Oi2/5proVOwIH9fV2F+5ovJQ1FAEN\nXxDqbzd73vdL7PSuRcRRCHtodVxs1CrWVNSCIrPRmK2EvwBfla3qSaK2u3bamQDT8N9XXt4GsNyD\na+D0J/eyxE7vWkRyFMIebPVXCgjU0GwroDXqDl7Y7HkCO5bsCHQ4nr0UOIrlHVwDJ/fspW0QAevV\n5dH9FmRFIczQtrx1MUh6jiyGngDPYX3F8gBdLhawVi1P7Vji2oMgbPaVS9tYrzooGdQYEbIjvy1h\nDzaTt4CX5NzuD9FzR9Yd1qUte32eJnbUpnYscwI4eIaXtkQrexkRRyHswfqKIjSI2Ezehgdlm3aE\nVzM2ig9VEbZ9mXMt1yriKIQJ/eEI2xa0F8KEBxSbA+MeOywObEG+6JAFISmVrJSLk+p2SWQvH8v7\nlycox5b2Qpjwz7Ydepq8zoHDWuawU0DwTGVFsXyIoxAmtHOgPBbecWVzcAxmvbYFdgI7Xgtx/eAe\nZEWxfMRyFER0OxE9S0QXiOiBOe8TET3ov/80Ed2y6Foi2iCiTxHRc/6/66H33u+f/ywRvSPrTQrx\naOVAbjMvK4pmTma/ebFDBcHv9rVwL9caCx0FERUBfBjAaQAnAdxJRCdnTjsN4IT/dQ+Aj8S49gEA\nTzLzCQBP+t/Df/8OAG8CcDuA3/Y/R9CMzT5PATWniEqpgNVyEVXH3u7tyaBmeSY/HVyXfxYe/F3Z\n/PsS0hFnRXErgAvM/DwzuwAeBXBm5pwzAD7OHk8BWCOiowuuPQPgEf/1IwDeFTr+KDP3mflrAC74\nnyNoxqYGRAARoVmvWJ91TuPpdgfowFHZEHBSzSSM9hpwetcacaZsNwB4IfT9iwDeGuOcGxZcez0z\nX/Rfvwzg+tBnPTXns5Tz5Ze38LN/+Dc6PnopaXddOKUCapZV1Bp1B7bleQ5VSnCKhdysKJZ5a2xA\n4HxfC/dyrZGLymxmZiLiJNcQ0T3wwly4+eabU/3clVIRJ6630/Atj5wA8OYb1qyrqL3vB74FsOwq\niAgf+Mffhu+4ac2qHW9o1nDfP/oW3P7tR63aoYLbv/2b0er0cbxRs22KkJA4juIlADeFvr/RPxbn\nnHLEtZeI6CgzX/TDVK8k+Hlg5ocBPAwAp06dSuRkAo41a/jtn/7uNJcKGsnLoHj3Pzxm2wQUCoR/\n/Y6/b9sMJRy9bvU1cy/XGnFyFJ8GcIKIjhORAy/RfHbmnLMA7vJ3P90G4KofVoq69iyAu/3XdwP4\nZOj4HURUIaLj8Ca6f53y/gRBEISMLFxRMPOQiO4H8ASAIoCPMfN5IrrXf/8hAI8DeCe8xHMPwHui\nrvU/+kMAHiOi9wL4BoB3+9ecJ6LHAHwJwBDAfcw8UnXDgiAIQjKIOVXUJlecOnWKz507Z9sMQRCE\npYKIPsPMpxadJ5XZgiAIQiTiKARBEIRIxFEIgiAIkYijEARBECIRRyEIgiBE8prY9UREr8LbYptn\nmgBato2IgdipnmWxVexUT95tfT0zH1l00mvCUSwDRHQuzjY024id6lkWW8VO9SyTrVFI6EkQBEGI\nRByFIAiCEIk4CnM8bNuAmIid6lkWW8VO9SyTrQciOQpBEAQhEllRCIIgCJGIo1AAEd1ERP+HiL5E\nROeJ6F/5xz9IRC8R0ef8r3eGrnk/EV0gomeJ6B0Gbf06EX3Bt+ecf2yDiD5FRM/5/67nwM5vDT23\nzxHRFhH9XB6eKRF9jIheIaIvho4lfoZE9N3+7+ICET1IihWjDrDzPxDRl4noaSL6BBGt+cePEdFO\n6Lk+ZMrOCFsT/64tPdM/Ctn4dSL6nH/c6jNVCjPLV8YvAEcB3OK/PgTgKwBOAvgggF+cc/5JAJ8H\nUAFwHMBXARQN2fp1AM2ZY78O4AH/9QMAfs22nTP2FeHJ5b4+D88UwPcBuAXAF7M8Q3g6K7fBk/P7\nEwCnDdj5wwBK/utfC9l5LHzezOdotTPC1sS/axvPdOb93wDwy3l4piq/ZEWhAGa+yMyf9V9vA3gG\n0TrfZwA8ysx9Zv4aPB2PW/VbGmnPI/7rRwC8K3Q8D3a+DcBXmTmqqNKYrcz85wA25/z82M+QPFXH\nw8z8FHsjx8dD12izk5n/NzMP/W+fgqcgeSAm7DzI1ghy9UwD/FXBuwH8t6jPMPVMVSKOQjFEdAzA\ndwH4K//Qz/rL/I+FwhE3AHghdNmLiHYsKmEAf0ZEnyFPdxwArmdPkRDwZu7X+69t2hnmDuz9z5e3\nZwokf4Y3+K9nj5vkX8CbzQYc90Mk/4+Ivtc/ZtvOJL9r27Z+L4BLzPxc6Fgen2lixFEohIjqAP4n\ngJ9j5i0AHwHwBgDfCeAivGWpbb6Hmb8TwGkA9xHR94Xf9Gc4udkKR56E7o8B+O/+oTw+0z3k7RnO\ng4g+AE9B8g/8QxcB3Oz/bfw8gD8kosO27PPJ/e96hjuxd0KTx2eaCnEUiiCiMjwn8QfM/L8AgJkv\nMfOImccAPoppKOQlADeFLr/RP6YdZn7J//cVAJ/wbbrkL4eDZfErtu0McRrAZ5n5EpDPZ+qT9Bm+\nhL1hH2P2EtE/B/AjAH7ad2rwwzht//Vn4MX932jTzhS/a5vPtATgJwD8UXAsj880LeIoFODHJn8H\nwDPM/Juh40dDp/04gGCnxFkAdxBRhYiOAzgBL7ml284aER0KXsNLbH7Rt+du/7S7AXzSpp0z7Jml\n5e2Zhkj0DP0w1RYR3eb//dwVukYbRHQ7gF8C8GPM3AsdP0JERf/1G3w7n7dlp29Hot+1TVsB/BCA\nLzPzJKSUx2eaGtvZ9NfCF4DvgRdqeBrA5/yvdwL4PQBf8I+fBXA0dM0H4M0wnoWhHQ/wlvGf97/O\nA/iAf7wB4EkAzwH4MwAbNu0M/ewagDaA60LHrD9TeI7rIoABvPjye9M8QwCn4A1+XwXwW/ALYDXb\neQFefD/4O33IP/cn/b+JzwH4LIAfNWVnhK2Jf9c2nql//HcB3DtzrtVnqvJLKrMFQRCESCT0JAiC\nIEQijkIQBEGIRByFIAiCEIk4CkEQBCEScRSCIAhCJOIoBEEQhEjEUQiCIAiRiKMQBEEQIvn/HPSF\nUABu1EgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x5278e978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = list(zip(*rst))[1]\n",
    "y = list(zip(*rst))[2]\n",
    "\n",
    "plt.plot(x, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ex10：Plus One\n",
    "\n",
    "Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.\n",
    "\n",
    "You may assume the integer do not contain any leading zero, except the number 0 itself.\n",
    "\n",
    "The digits are stored such that the most significant digit is at the head of the list.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plusOne(digits):\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 2, 4]\n",
      "[1, 0, 0, 0]\n"
     ]
    }
   ],
   "source": [
    "digits = [1, 2, 3]\n",
    "print(plusOne(digits))\n",
    "digits = [9, 9, 9]\n",
    "print(plusOne(digits))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
